package com.handl.springcloud.service.impl;

import com.handl.springcloud.service.TestService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * Created by handl on 2017/10/29.
 */
@Service
public class TestServiceImpl implements TestService {
    //在服务类中注入ribbon负载均衡的调用模板类，用来处理服务调用
    @Autowired
    private RestTemplate restTemplate;

    /**
     * HystrixCommand注解:断路器服务降级，
     *      fallbackMethod属性来指定在服务异常不可调用时，所处理请求的方法
     * restTemplate模板对象：
     *      参数1：调用服务的地址，不是具体的ip，是通过服务名称来调用
     *      参数2：返回数据的类型
     *
     * 调用服务时参数的传递：
     *      1.可以直接在url拼接参数
     *      2.可以通过占位符替换
     *          例如
     *              数组形式：restTemplate.getForObject("http://CLIENT/who?name={1}",String.class,nameValue)
     *              Map形式：restTemplate.getForObject("http://CLIENT/who?name={name}",String.class,mapValues)
     *                  map的key就是占位名称{name}
     * @return
     */
    @HystrixCommand(fallbackMethod = "error")
    @Override
    public String getRibbon() {
        return restTemplate.getForObject("http://CLIENT/who",String.class);
    }

    @Override
    public String zipkinServer() {
        return restTemplate.getForObject("http://feign/feignTest",String.class);
    }

    /**
     * 断路器回掉方法中可以直接获取Throwable异常对象
     * @param e
     * @return
     */
    private String error(Throwable e){
        System.out.println("------------------触发断路器服务降级异常--------------------------");
        e.printStackTrace();
        return "Server Error!!!";
    }
}
